GOTO redux: recoup: CLS STOP redux: ON BREAK GOSUB recoup: BREAK ON start: ' Math Drill by Alex Bogomolny DEFINT a-z:WIDTH "scrn:",80 DIM titles$(3):PosReply=18:NegReply=12 DIM sp$(PosReply+NegReply) RANDOMIZE TIMER:ON BREAK GOSUB ExitProgram:BREAK ON SCREEN 1,320,200,2,1:WIDTH ,80 WINDOW 2,"Math Drill",,0,1:WINDOW OUTPUT 2 LOCATE 5,3 GOSUB ReadData:GOSUB SetMenu:ON MENU GOSUB ProcessMenu GOSUB ChooseColors SAY "THAENKS. WEHLKAHM TUW DHEH MAE3TH DRIYL." GOSUB RequestSelection MainStart: RANDOMIZE TIMER score=6:count=0 IF oldchoice=0 GOTO MainStart IF oldchoice=5 THEN ExitProgram WHILE score<25 choice=oldchoice RepeatAfterWrongAnswer: GOSUB ChooseColors GOSUB DrawTitle GOSUB DigitsChoice GOSUB ScoreColumn GOSUB GiveProblem GOSUB GetAnswer IF answer=axb THEN GOSUB Correct :ELSE GOSUB Wrong WEND GOSUB RequestSelection GOTO MainStart ExitProgram: SAY "SIY2 YUW AXGEY3N SUW6N." MENU OFF:WINDOW CLOSE 2:SCREEN CLOSE 1:WINDOW 1:WINDOW OUTPUT 1 GOTO recoup ' RequestSelection: CLS SAY "MEY3K YOHR CHOY4S." oldchoice=0 GOSUB DigitsChoice RETURN ReadData: DECLARE FUNCTION Move LIBRARY LIBRARY "graphics.library":RP&=WINDOW(8) bckgr=0:forgr=1:boxclr=2:flush=3 stp=2:Maximum=100:MenuOn=0 FOR i=0 TO 3:READ titles$(i):NEXT DATA "ADDITION","SUBTRACTION","MULTIPLICATION","DIVISION" FOR i=0 TO PosReply+NegReply:READ sp$(i):NEXT DATA "UWRX TEHRIY4FIXK.","AO9BOY7.","GUH3D DJAA6B.","FAY9N." DATA "KAH2NGRXAH3CHUHLEY8SHNS.","DHAE2TS GUH4D." DATA "GUH2D FAXR YUW5.","NAYS DJAAB.","DHAE2TS GREY6T." DATA "YUW2RX GREY6T.","YUW2L MEY8K IHT.","VEH3RIH GUW6D." DATA "AY AXM PRAW3D AXV YUW3.","YUW2 DIH5D IHT.","WEH2L DAH4N." DATA "YUW MEYK MIH /HAE4PIH.","GREY9T.","DHAETS RAY4T.","KAX2REH5KT." DATA "/HAW4Z DHAE2T?","AO2 /HOH /HOH5.","ROH6NG.","AY AXM SAA5RIH." DATA "TRAY AXGEY4N.","THIH4NK BEH6TEH2RX.","AA YUW SHUW3R?" DATA "YUW3 BEH9T.","KAXM AO2N.","OH KAX3M AO2N.","IHNDIY2D?" DATA "AA YUW SIY4RIHEH2Z?" RETURN RETURN ScoreColumn: LINE (290,0)-(309,199),forgr,bf LINE (290,194-8*score)-(309,199),boxclr,bf LINE (290,0)-(309,186),forgr,b:LINE(291,1)-(308,185),bckgr,b FOR i=2 TO score i8=i*8 LINE(291,193-i8)-(308,193-i8),bckgr LINE(301,196-i8)-(303,198-i8),forgr:LINE(303,198-i8)-(306,195-i8),forgr NEXT RETURN DigitsChoice: FOR i=0 TO 9 LINE (7+i*24,155)-(30+i*24,172),boxclr,bf COLOR ,boxclr:CALL Move&(RP&,13+i*24,167) PRINT RIGHT$(STR$(i),1); LINE (7+i*24,155)-(30+i*24,172),forgr,b NEXT LINE (173,35)-(246,80),boxclr,bf LINE (173,92)-(246,136),boxclr,bf LINE (173,35)-(246,80),forgr,b LINE (173,92)-(246,136),forgr,b CALL Move&(RP&,202,60):PRINT "OK":CALL Move&(RP&,182,116):PRINT "CANCEL" RETURN DrawTitle: t$=titles$(choice-1):nt=(30-LEN(t$))/2:LOCATE 1,nt:PRINT t$ RETURN GiveProblem: IF answer<>axb THEN GOSUB DrawProblem:RETURN a=INT(RND*(Maximum+1)) ON choice GOSUB Addition,Subtraction,Multiplication,Division GOSUB DrawProblem RETURN Addition: sign$="+":b=INT(RND*(Maximum+1-a)):axb=a+b:RETURN Subtraction: sign$="-":b=INT(RND*(Maximum+1)):IF b>a THEN SWAP a,b axb=a-b:RETURN Multiplication: sign$="x":b=INT(RND^1.2*(Maximum+1)):axb=a*b:RETURN Division: sign$=":":b=INT(RND^1.2*(Maximum+1)):IF b=0 GOTO Division axb=a:a=a*b:RETURN SUB DrawP(x,h) STATIC DEFINT a-z x$=MID$(STR$(x),2):l=LEN(x$):ll=l FOR i=1 TO l v=VAL(LEFT$(x$,1)) 'SOUND RND*150+200,2,48,0: SOUND RND*150+200,2,48,1 'SOUND RND*150+200,2,48,2: SOUND RND*150+200,2,48,3 CALL DisplayOneDigit(112,l,i,24,h,v) ll=ll-1:IF ll<>0 THEN x$=RIGHT$(x$,ll) NEXT END SUB DrawProblem: LINE(0,10)-(115,115),bckgr,bf 'erase previous example CALL DrawP(a,50) nd1=LEN(STR$(a))-1:nd2=LEN(STR$(b))-1:IF nd12):Ystart=64:clr1=bckgr:clr2=forgr ON choice GOSUB Plus,Minus,Times,Divide 'SOUND RND*150+200,2,64,0: SOUND RND*150+200,2,64,1 'SOUND RND*150+200,2,64,2: SOUND RND*150+200,2,64,3 CALL DrawP(b,76) LINE(62+24*(axb>=100 OR nd1=3),82)-(112,86),forgr,bf RETURN GetAnswer: answer=0:nd=0 'nd is the number of entered digits WaitAgain: m=MOUSE(0):IF m=0 GOTO WaitAgain WHILE MOUSE(0)<>0:WEND x=MOUSE(1):y=MOUSE(2) IF x>173 AND x<246 AND y>35 AND y<80 THEN CALL Flushlight(173,246,35,80):RETURN 'OK IF x>173 AND x<246 AND y>92 AND y<136 THEN answer=0:nd=0:LINE (0,90)-(115,120),bckgr,bf:CALL Flushlight(173,246,92,136):GOTO WaitAgain GOSUB SeeIfInteger:IF NOT intgr GOTO WaitAgain FOR fl=0 TO 8 LINE(7+k*24,155)-(30+k*24,172),flush,bf LINE(7+k*24,155)-(30+k*24,172),boxclr,bf NEXT CALL Move&(RP&,13+k*24,167):PRINT RIGHT$(STR$(k),1); LINE(7+k*24,155)-(30+k*24,172),forgr,b nd=nd+1 IF nd>4 THEN answer=0:SAY TRANSLATE$("too large a number. sorry for that.") LINE (0,90)-(115,115),bckgr,bf:nd=0 ELSE answer=answer*10+k IF MenuOn=0 THEN GOSUB DisplayAnswer ELSE LOCATE 17,nd+3:PRINT RIGHT$(STR$(k),1) END IF END IF GOTO WaitAgain RETURN SeeIfInteger: intgr=0 IF y<155 OR y>172 THEN RETURN IF x>7 AND x<30 THEN intgr=-1:k=0 ELSEIF x>31 AND x<54 THEN intgr=-1:k=1 ELSEIF x>55 AND x<78 THEN intgr=-1:k=2 ELSEIF x>79 AND x<102 THEN intgr=-1:k=3 ELSEIF x>103 AND x<126 THEN intgr=-1:k=4 ELSEIF x>127 AND x<150 THEN intgr=-1:k=5 ELSEIF x>151 AND x<174 THEN intgr=-1:k=6 ELSEIF x>175 AND x<198 THEN intgr=-1:k=7 ELSEIF x>199 AND x<222 THEN intgr=-1:k=8 ELSEIF x>223 AND x<246 THEN intgr=-1:k=9 END IF RETURN DisplayAnswer: FOR scr=1 TO 8 SCROLL(0,90)-(112,115),-3,0 NEXT PAINT(110,102),bckgr 'SOUND RND*150+350,2,64,0: SOUND RND*150+350,2,64,1 'SOUND RND*150+350,2,64,2: SOUND RND*150+350,2,64,3 CALL DisplayOneDigit(112,nd,nd,24,112,k) RETURN Correct: score=score+1:SAY sp$(FIX(RND*(PosReply+1))) RETURN Wrong: score=score-1:IF score<1 THEN score=1 SAY sp$(FIX((PosReply+1)+RND*NegReply)) a$=MID$(STR$(a),2):b$=MID$(STR$(b),2) LOCATE 16,2:PRINT "Correct Result:":LOCATE 17,8 PRINT a$;sign$;b$;"=";MID$(STR$(axb),2) CALL Waiting(3):LINE (0,120)-(60,150),bckgr,bf RETURN RepeatAfterWrongAnswer SUB Waiting(n) STATIC FOR i=1 TO n:now$=TIME$:WHILE TIME$=now$:WEND:NEXT END SUB ChooseColors: PALETTE bckgr,RND/4,RND/2,RND/2 PALETTE forgr,RND/8,(4+RND)/5,RND/2 PALETTE boxclr,(3+RND)/4,RND/4,RND/2 PALETTE flush,(3+RND)/4,(1+RND)/3,(3+RND)/8 IF RND<0.5 THEN SWAP forgr,bckgr IF RND<0.5 THEN SWAP flush,boxclr COLOR forgr,bckgr:CLS RETURN SUB Flushlight(x1,x2,y1,y2) STATIC DEFINT a-z SHARED flush,bckgr FOR j=1 TO 3 FOR i=1 TO 6 PALETTE flush,(1+RND)/2,(1+RND)/2,(1+RND)/2 LINE(x1-i,y1-i)-(x2+i,y2+i),flush,b NEXT FOR i=6 TO 1 STEP -1 LINE(x1-i,y1-i)-(x2+i,y2+i),bckgr,b NEXT NEXT END SUB SUB DisplayOneDigit(Xptr,TotalLength,Xoffset,Xsize,Ystart,v) STATIC SHARED stp,forgr,bckgr DEFINT a-z Xstart=Xptr-(TotalLength-Xoffset+1)*Xsize PSET(Xstart,Ystart),bckgr ON (v+1) GOSUB Digit0,Digit1,Digit2,Digit3,Digit4,Digit5,Digit6,Digit7,Digit8,Digit9 COLOR forgr EXIT SUB Digit0: AREA STEP(0,-stp):AREA STEP(0,-8*stp):AREA STEP(stp,-stp) AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,8*stp) AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp) AREAFILL PSET STEP(2*stp+1,-2-stp):AREA STEP(0,3-6*stp):AREA STEP(6*stp-3,0) AREA STEP(3-6*stp,6*stp-3):COLOR bckgr:AREAFILL PSET STEP(2*stp,1):AREA STEP(4*stp-2,2-4*stp):AREA STEP(0,4*stp-2) AREA STEP(2-4*stp,0):AREAFILL RETURN END Digit1: AREA STEP(0,-2*stp):AREA STEP(4*stp,0):AREA STEP(0,-5*stp) AREA STEP(-3*stp,0):AREA STEP(3*stp,-3*stp):AREA STEP(2*stp,0) AREA STEP(0,8*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp) AREA STEP(-10*stp,0):AREAFILL RETURN END Digit2: AREA STEP(0,-5*stp):AREA STEP(stp,-stp):AREA STEP(7*stp,0) AREA STEP(0,-2*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp) AREA STEP(-2*stp,0):AREA STEP(0,-2*stp):AREA STEP(stp,-stp) AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp) AREA STEP(-stp,stp):AREA STEP(-7*stp,0):AREA STEP(0,2*stp) AREA STEP(8*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0) AREAFILL RETURN END Digit3: AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp) AREA STEP(-6*stp,0):AREA STEP(0,-2*stp):AREA STEP(6*stp,0) AREA STEP(0,-2*stp):AREA STEP(-8*stp,0):AREA STEP(0,-2*stp) AREA STEP(9*stp,0):AREA STEP(stp,stp):AREA STEP(0,3*stp) AREA STEP(-stp,stp):AREA STEP(stp,stp):AREA STEP(0,3*stp) AREA STEP(-stp,stp):AREA STEP(-9*stp,0) AREAFILL RETURN END Digit4: PSET STEP(6*stp,0),bcgr AREA STEP(0,-4*stp):AREA STEP(-6*stp,0):AREA STEP(0,-6*stp) AREA STEP(2*stp,0):AREA STEP(0,4*stp):AREA STEP(4*stp,0) AREA STEP(0,-4*stp):AREA STEP(2*stp,0):AREA STEP(0,4*stp) AREA STEP(2*stp,0):AREA STEP(0,2*stp):AREA STEP(-2*stp,0) AREA STEP(0,4*stp):AREA STEP(-2*stp,0) AREAFILL RETURN END Digit5: PSET STEP(0,-stp),bckgr AREA STEP(0,-2*stp):AREA STEP(2*stp,0):AREA STEP(0,stp) AREA STEP(6*stp,0):AREA STEP(0,-2*stp):AREA STEP(-7*stp,0) AREA STEP(-stp,-stp):AREA STEP(0,-5*stp):AREA STEP(10*stp,0) AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp) AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp) AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp) AREAFILL RETURN END Digit6: PSET STEP(0,-stp),bckgr AREA STEP(0,-8*stp):AREA STEP(stp,-stp):AREA STEP(9*stp,0) AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp) AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp) AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp) AREAFILL PSET STEP(2*stp,-stp):AREA STEP(1,-2*stp+1) AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(-6*stp+2,0) COLOR bckgr:AREAFILL RETURN END Digit7: AREA STEP(8*stp,-8*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp) AREA STEP(-2*stp,0):AREA STEP(0,-3*stp):AREA STEP(11*stp,0) AREA STEP(0,2*stp):AREA STEP(-8*stp,8*stp):AREA STEP(-3*stp,0) AREAFILL RETURN END Digit8: AREA STEP(0,-stp) AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(-stp,-stp) AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(8*stp,0) AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp) AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp) AREA STEP(-8*stp,0):AREA STEP(-stp,-stp) AREAFILL AREA STEP(1+2*stp,1-3*stp) AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0) COLOR bckgr:AREAFILL AREA STEP(0,1-6*stp):AREA STEP(6*stp-2,0) AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0) AREAFILL RETURN END Digit9: AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp) AREA STEP(-7*stp,0):AREA STEP(-stp,-stp):AREA STEP(0,-4*stp) AREA STEP(stp,-stp):AREA STEP(8*stp,0):AREA STEP(stp,stp) AREA STEP(0,8*stp):AREA STEP(-stp,stp):AREA STEP(-9*stp,0) AREAFILL PSET STEP(8*stp,-8*stp):AREA STEP(-1,2*stp-1) AREA STEP(2-6*stp,0):AREA STEP(0,2-2*stp):AREA STEP(6*stp-2,0) COLOR bckgr:AREAFILL RETURN END END SUB Plus: PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp) AREA STEP(4*stp,0):AREA STEP(0,-4*stp):AREA STEP(2*stp,0) AREA STEP(0,4*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp) AREA STEP(-4*stp,0):AREA STEP(0,4*stp):AREA STEP(-2*stp,0) AREA STEP(0,-4*stp):AREA STEP(-4*stp,0) COLOR clr2:AREAFILL RETURN END Minus: PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp) AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0) COLOR clr2:AREAFILL RETURN END Times: PSET(Xstart,Ystart),clr1:AREA STEP(0,-stp):AREA STEP(4*stp,-4*stp) AREA STEP(-4*stp,-4*stp):AREA STEP(0,-stp):AREA STEP(stp,0) AREA STEP(4*stp,4*stp):AREA STEP(4*stp,-4*stp):AREA STEP(stp,0) AREA STEP(0,stp):AREA STEP(-4*stp,4*stp):AREA STEP(4*stp,4*stp) AREA STEP(0,stp):AREA STEP(-stp,0):AREA STEP(-4*stp,-4*stp) AREA STEP(-4*stp,4*stp):AREA STEP(-stp,0) COLOR clr2:AREAFILL RETURN END Divide: PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp) AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0) COLOR clr2:AREAFILL CIRCLE(Xstart+5*stp,Ystart-9*stp),stp*1.4 PAINT(Xstart+5*stp,Ystart-9*stp),clr2 CIRCLE(Xstart+5*stp,Ystart-stp),stp*1.4 PAINT(Xstart+5*stp,Ystart-stp),clr2 RETURN END SetMenu: MENU 1,0,1,"Operation" MENU 1,1,1,"Addition" MENU 1,2,1,"Subtraction" MENU 1,3,1,"Multiplication" MENU 1,4,1,"Division" MENU 1,5,1,"Quit" MENU 2,0,1,"Maximum" MENU 2,1,1," 10" MENU 2,2,1," 100" MENU 2,3,1," Define" MENU 2,4,1,"Display" MENU ON RETURN END Op: oldchoice=MENU(1) IF oldchoice<3 AND Maximum>1000 THEN Maximum=1000 IF oldchoice>2 AND Maximum>31 THEN Maximum=31 RETURN END MaxNum: IF MENU(1)=1 THEN Maximum=10:RETURN END IF IF MENU(1)=2 THEN Maximum=100:IF oldchoice>2 THEN Maximum=31 RETURN END IF IF MENU(1)=4 THEN GOSUB DisplayMaximum:RETURN TryAgain: LINE(5,120)-(130,140),bckgr,bf LOCATE 16,2:PRINT "Maximum Number"; LOCATE 17,2:PRINT CHR$(62);" "; answTemporary=answer:ndTemporary=nd GOSUB GetAnswer:Maximum=answer:answer=answTemporary:nd=ndTemporary IF oldchoice<3 AND Maximum>1000 THEN TryAgain IF oldchoice>2 AND Maximum>31 THEN TryAgain LINE(5,120)-(150,152),bckgr,bf RETURN END ProcessMenu: MenuOn=MENU(0) ON MenuOn GOSUB Op,MaxNum MenuOn=0 RETURN END DisplayMaximum: LOCATE 16,2:PRINT "Maximum Number"; LOCATE 17,2:PRINT CHR$(62);" ";Maximum WHILE MOUSE(0)=0:WEND LINE(5,120)-(150,152),bckgr,bf RETURN